import storage from 'good-storage'

const SEARCH_KEY = '__search__'
const SEARCH_MAX_LENGTH = 15 // 最多缓存 15 条数据

const PLAY_KEY = '__play__'
const PLAY_MAX_LENGTH = 200 // 最多缓存 200 首歌曲播放记录

const FAVORITE_KEY = '__favorite__'
const FAVORITE_MAX_LENGTH = 200 // 最多收藏 200 首歌

// 定义插入数组方法
function insertArray (arr, val, compare, maxLen) {
  const index = arr.findIndex(compare) // 查找有没有这条数据

  // 如果有这条数据，并且是第一个，则什么都不做
  if (index === 0) {
    return
  }

  // 如果有这条数据，并且不是第一个，则现将这条数据删除
  if (index > 0) {
    arr.splice(index, 1)
  }

  // 在数组开头添加这条数据
  arr.unshift(val)

  // 如果设置了最大长度(maxLen)并且数组实际长度大于最大长度，则删除最后一项
  if (maxLen && arr.length > maxLen) {
    arr.pop()
  }
}

// 定义删除数组元素方法
function deleteFromArray (arr, compare) {
  const index = arr.findIndex(compare)

  if (index > -1) {
    arr.splice(index, 1)
  }
}

export function saveSearch (query) {
  let searches = storage.get(SEARCH_KEY, []) // 先查找，没有则返回空数组

  insertArray(searches, query, (item) => {
    return item === query
  }, SEARCH_MAX_LENGTH)

  storage.set(SEARCH_KEY, searches)

  return searches
}

export function loadSearch () {
  return storage.get(SEARCH_KEY, [])
}

export function deleteSearch (query) {
  // 先获取 localStorage 中的数据
  let searches = storage.get(SEARCH_KEY, [])

  // 删除对应数组成员
  deleteFromArray(searches, (item) => {
    return item === query
  })

  // 将处理后的数组保存到 localStorage 中并返回
  storage.set(SEARCH_KEY, searches)

  return searches
}

export function clearSearch () {
  storage.remove(SEARCH_KEY)
  return []
}

// 将播放历史写入 localStorage
export function savePlay (song) {
  // 先获取当前播放历史列表，没有则返回 []
  let songs = storage.get(PLAY_KEY, [])

  // 将 song 插入播放历史列表中
  insertArray(songs, song, (item) => {
    return item.rid === song.rid
  }, PLAY_MAX_LENGTH)

  // 写入 localStorage
  storage.set(PLAY_KEY, songs)
  return songs
}

// 读取播放历史
export function loadPlay () {
  // 获取当前播放历史列表，没有则返回 []
  return storage.get(PLAY_KEY, [])
}

// 将收藏歌曲数据写入 localStorage
export function saveFavorite (song) {
  // 先获取，没有则返回空数组
  let songs = storage.get(FAVORITE_KEY, [])

  // 将歌曲插入数组
  insertArray(songs, song, (item) => {
    return item.rid === song.rid
  }, FAVORITE_MAX_LENGTH)

  // 写入 localStorage
  storage.set(FAVORITE_KEY, songs)
  return songs
}

// 将收藏歌曲数据从 localStorage 中删除
export function deleteFavorite (song) {
  // 先获取，没有则返回空数组
  let songs = storage.get(FAVORITE_KEY, [])

  // 删除 songs 中的对应项
  deleteFromArray(songs, (item) => {
    return item.rid === song.rid
  })

  // 写入 localStorage
  storage.set(FAVORITE_KEY, songs)
  return songs
}

// 从 localStorage 中读取收藏歌曲数据
export function loadFavorite () {
  // 获取收藏歌曲数据列表，没有则返回 []
  return storage.get(FAVORITE_KEY, [])
}
